/**
 * @file StdLogger.cc
 * @author Bono.ASUN.TamGitsun (gitsun.tam@outlook.com)
 * @brief 
 * @version 0.1
 * @date 2022-02-07
 * 
 * @copyright Copyright (c) 2022
 * 
 */


#include "StdLogger.hh"
#include <iostream>
#include <stdarg.h>


namespace TGS::utils {


void StdLogger::log_v(const std::string & message)
{
    if (mLevel >= ILogger::LEVEL_VERBOSE)
    {
        std::cout << message << std::endl;
    }
}

void StdLogger::log_d(const std::string & message)
{
    if (mLevel >= ILogger::LEVEL_DEBUG)
    {
        std::cout << message << std::endl;
    }
}

void StdLogger::log_i(const std::string & message)
{
    if (mLevel >= ILogger::LEVEL_INFO)
    {
        std::cout << message << std::endl;
    }
}

void StdLogger::log_w(const std::string & message)
{
    if (mLevel >= ILogger::LEVEL_WARN)
    {
        std::cout << message << std::endl;
    }
}

void StdLogger::log_e(const std::string & message)
{
    if (mLevel >= ILogger::LEVEL_ERROR)
    {
        std::cout << message << std::endl;
    }
}

void StdLogger::log_wtf(const std::string & message)
{
    if (mLevel >= ILogger::LEVEL_WTF)
    {
        std::cout << message << std::endl;
    }
}


template <typename Fn>
static void logging_(Fn fn, const std::string & fmt, va_list ap)
{
    char buffer[2048];
    vsnprintf(buffer, sizeof(buffer), fmt.c_str(), ap);
    fn(std::string(buffer));
}


void StdLogger::log_v(const char * fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    logging_([this](std::string & buffer) {
        log_v(buffer);
    }, fmt, ap);
    va_end(ap);
}

void StdLogger::log_d(const char * fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    logging_([this](std::string & buffer) {
        log_d(buffer);
    }, fmt, ap);
    va_end(ap);
}

void StdLogger::log_i(const char * fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    logging_([this](std::string & buffer) {
        log_i(buffer);
    }, fmt, ap);
    va_end(ap);
}

void StdLogger::log_w(const char * fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    logging_([this](std::string & buffer) {
        log_w(buffer);
    }, fmt, ap);
    va_end(ap);
}

void StdLogger::log_e(const char * fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    logging_([this](std::string & buffer) {
        log_e(buffer);
    }, fmt, ap);
    va_end(ap);
}

void StdLogger::log_wtf(const char * fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    logging_([this](std::string & buffer) {
        log_wtf(buffer);
    }, fmt, ap);
    va_end(ap);
}




}
